# -*- coding: utf-8 -*-

import json
import os

from flask import Flask, request, url_for, redirect, render_template
from flask_cors import cross_origin

import wzs
import zx
import utils

# app = Flask(__name__)


app = Flask(import_name=__name__,
            static_url_path='/',  # 配置静态文件的访问 url 前缀
            static_folder='static',  # 配置静态文件的文件夹
      )


@app.route('/')
def hello_world():
    return app.send_static_file('index.html')
    # return render_template('index.html')  # homepage.html在static文件夹下


def pre_process():
    request_parameter = utils.request_parse(request)
    file_name = request_parameter.get("file_name")
    data = utils.read_csv(file_name)
    return data


def pre_process_wzs():
    request_parameter = utils.request_parse(request)
    file_name = request_parameter.get("file_name")
    data = utils.read_csv(file_name)
    return data


# http://127.0.0.1:5000/get_file_data?file_name=10046005
# 返回文件名的csv的数据
@app.route('/get_file_data')  # 注册方法
@cross_origin(supports_credentials=True)  # 添加跨域
def get_file_data_request():
    return json.dumps(pre_process().transpose().tolist())


# http://127.0.0.1:5000/get_files
# 返回所有文件名
@app.route('/get_files')  # 注册方法
@cross_origin(supports_credentials=True)  # 添加跨域
def get_files_request():
    return json.dumps(list(utils.get_files()))


# http://127.0.0.1:5000/get_files_ann
# 返回所有文件名+标注信息
# {fileName, status}
ANN_NEG = -1  # 标注状态，负样本
ANN_POS = 1  # 标注状态，正样本
ANN_WAIT = 0  # 标注状态，待标注


@app.route('/get_files_ann')  # 注册方法
@cross_origin(supports_credentials=True)  # 添加跨域
def get_files_ann_request():
    result = []
    all = [_[0:-4] for _ in list(utils.get_files(utils.FILE_ROOT))]  # 去掉文件后缀
    pos = set([_[0:-4] for _ in list(utils.get_files(utils.POS_ROOT))])  # 去掉文件后缀
    neg = set([_[0:-4] for _ in list(utils.get_files(utils.NEG_ROOT))])  # 去掉文件后缀
    for item in all:
        if item in pos:
            result.append({"fileName": item, "status": ANN_POS, "predict": 0})
        elif item in neg:
            result.append({"fileName": item, "status": ANN_NEG, "predict": 0})
        else:
            result.append({"fileName": item, "status": ANN_WAIT, "predict": 0})
    return json.dumps(result)


# http://127.0.0.1:5000/get_files_predict?type=0
# 使用决策树方法(type=0)或者MLP方法(type=1)预测未标注数据
@app.route('/get_files_predict')  # 注册方法
@cross_origin(supports_credentials=True)  # 添加跨域
def get_files_predict_request():
    request_parameter = utils.request_parse(request)
    type = request_parameter.get("type")
    result = []
    all = [_[0:-4] for _ in list(utils.get_files(utils.FILE_ROOT))]  # 去掉文件后缀
    pos = set([_[0:-4] for _ in list(utils.get_files(utils.POS_ROOT))])  # 去掉文件后缀
    neg = set([_[0:-4] for _ in list(utils.get_files(utils.NEG_ROOT))])  # 去掉文件后缀
    for item in all:
        if item in pos:
            result.append({"fileName": item, "status": ANN_POS, "predict": 0})
        elif item in neg:
            result.append({"fileName": item, "status": ANN_NEG, "predict": 0})
        else:
            data = utils.read_csv(item)
            if int(type) == 0:
                res = zx.predict(data)
            else:
                res = wzs.predict(data)
            if res == 0:
                res = -1
            result.append({"fileName": item, "status": ANN_WAIT, "predict": res})
    return json.dumps(result)


# http://127.0.0.1:5000/zx?file_name=10046005
# 加载10046005.csv，并预测结果
@app.route('/zx')  # 注册方法
@cross_origin(supports_credentials=True)  # 添加跨域
def zx_request():
    # 预处理，获得file_name.csv的数据,已经将csv第一行去掉，并转换为float32，返回numpy格式
    data = pre_process()
    return json.dumps(zx.predict(data))


# http://127.0.0.1:5000/wzs?file_name=10046005
# 加载10046005.csv，并预测结果
@app.route('/wzs')  # 注册方法
@cross_origin(supports_credentials=True)  # 添加跨域
def wzs_request():
    # 预处理，获得file_name.csv的数据,已经将csv第一行去掉，并转换为float32，返回numpy格式
    data = pre_process_wzs()
    return json.dumps(wzs.predict(data))


# http://127.0.0.1:5000/annotation?file_name=10046005&result=true
# 标注10046005.csv，result=true表示为正样本，result=false为负样本
@app.route('/annotation')  # 注册方法
@cross_origin(supports_credentials=True)  # 添加跨域
def annotation_request():
    # 预处理，获得file_name.csv的数据,已经将csv第一行去掉，并转换为float32，返回numpy格式
    request_parameter = utils.request_parse(request)
    file_name = request_parameter.get("file_name")
    result = request_parameter.get("result")
    if result == 'true':
        # 先删负样本中的文件，再添加到正样本中去
        utils.delete_ann(os.path.dirname(os.path.abspath(__file__)) + utils.NEG_ROOT + file_name + ".txt")
        with open(os.path.dirname(os.path.abspath(__file__)) + utils.POS_ROOT + file_name + ".txt", "w") as f:
            f.write("1")
    else:
        utils.delete_ann(os.path.dirname(os.path.abspath(__file__)) + utils.POS_ROOT + file_name + ".txt")
        with open(os.path.dirname(os.path.abspath(__file__)) + utils.NEG_ROOT + file_name + ".txt", "w") as f:
            f.write("0")

    return json.dumps({"status": "ok"})


@app.route('/annotation2', methods=['POST'])  # 注册方法
@cross_origin(supports_credentials=True)  # 添加跨域
def annotation_request2():
    # 预处理，获得file_name.csv的数据,已经将csv第一行去掉，并转换为float32，返回numpy格式
    # request_parameter = utils.request_parse(request)
    file_name = request.args.get("file_name")
    result = request.args.get("result")
    details = request.get_json(force=True)
    if result == 'true':
        # 先删负样本中的文件，再添加到正样本中去
        utils.delete_ann(os.path.dirname(os.path.abspath(__file__)) + utils.NEG_ROOT + file_name + ".txt")
        with open(os.path.dirname(os.path.abspath(__file__)) + utils.POS_ROOT + file_name + ".txt", "w") as f:
            f.write(json.dumps(details,ensure_ascii=False,indent=4))
    else:
        utils.delete_ann(os.path.dirname(os.path.abspath(__file__)) + utils.POS_ROOT + file_name + ".txt")
        with open(os.path.dirname(os.path.abspath(__file__)) + utils.NEG_ROOT + file_name + ".txt", "w") as f:
            f.write(json.dumps(details,ensure_ascii=False,indent=4))

    return json.dumps({"status": "ok"})


if __name__ == '__main__':
    app.run(host="0.0.0.0", port=5000)
